/*-------------------------------------------------------------------------
 *
 * indexfsm.c
 *	  POSTGRES free space map for quickly finding free pages in relations
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * IDENTIFICATION
 *	  src/backend/storage/freespace/indexfsm.c
 *
 *
 * NOTES:
 *
 *	这类似于 freespace.c 中为堆使用的 FSM，但不跟踪页面上的空闲空间
 * 量，我们只跟踪页面是完全空闲还是在使用中。我们使用与堆相同的 FSM 实现，
 * 使用 BLCKSZ - 1 表示已用页面，使用 0 表示未用。
 *
 *-------------------------------------------------------------------------
 */
#include "postgres.h"

#include "storage/freespace.h"
#include "storage/indexfsm.h"

/*
 * 导出的例程
 */

/*
 * GetFreeIndexPage - 从FSM返回一个空闲页面
 *
 * 作为副作用，此页面在FSM中被标记为已使用。
 */
BlockNumber GetFreeIndexPage(Relation fc_rel)
{
	BlockNumber fc_blkno = GetPageWithFreeSpace(fc_rel, BLCKSZ / 2);

	if (fc_blkno != InvalidBlockNumber)
		RecordUsedIndexPage(fc_rel, fc_blkno);

	return fc_blkno;
}

/*
 * RecordFreeIndexPage - 在FSM中将页面标记为空闲
 */
void RecordFreeIndexPage(Relation fc_rel, BlockNumber fc_freeBlock)
{
	RecordPageWithFreeSpace(fc_rel, fc_freeBlock, BLCKSZ - 1);
}


/*
 * RecordUsedIndexPage - 在FSM中将页面标记为已使用
 */
void RecordUsedIndexPage(Relation fc_rel, BlockNumber fc_usedBlock)
{
	RecordPageWithFreeSpace(fc_rel, fc_usedBlock, 0);
}

/*
 * IndexFreeSpaceMapVacuum - 扫描并修复FSM中的任何不一致
 */
void IndexFreeSpaceMapVacuum(Relation fc_rel)
{
	FreeSpaceMapVacuum(fc_rel);
}
